package com.cb2.algorithm.leetcode;

/**
 * <a href='https://leetcode.cn/problems/long-pressed-name/'>长按键入(Long Pressed Name)</a>
 * <p>你的朋友正在使用键盘输入他的名字 name。偶尔，在键入字符 c 时，按键可能会被长按，而字符可能被输入 1 次或多次。</p>
 * <p>你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字（其中一些字符可能被长按），那么就返回 True。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 *  示例 1：
 *      输入：name = "alex", typed = "aaleex"
 *      输出：true
 *      解释：'alex' 中的 'a' 和 'e' 被长按。
 *
 * 示例 2：
 *      输入：name = "saeed", typed = "ssaaedd"
 *      输出：false
 *      解释：'e' 一定需要被键入两次，但在 typed 的输出中不是这样。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>1 <= name.length, typed.length <= 1000</li>
 *     <li>name 和 typed 的字符都是小写字母</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2025/2/21 15:58
 */
public class LC0925LongPressedName_S {
    static class Solution {
        public boolean isLongPressedName(String name, String typed) {
            if (name.length() > typed.length()) {
                return false;
            }
            char[] nChars = name.toCharArray();
            char[] tChars = typed.toCharArray();
            char currChar = nChars[0];
            int time = 1;
            int tIndex = 0;
            for (int i = 1; i < nChars.length; i++) {
                // 统计当前字符在name中的连续出现次数
                if (nChars[i] == currChar) {
                    ++time;
                } else {
                    // 处理typed中连续的当前字符
                    while (tIndex < tChars.length && tChars[tIndex] == currChar) {
                        --time;
                        ++tIndex;
                    }
                    // name中currChar连续出现次数 > types中currChar的连续出现次数，返回false
                    if (time > 0) {
                        return false;
                    }
                    // 继续检查下一个字符
                    currChar = nChars[i];
                    time = 1;
                }
            }
            // 处理name遍历完后的剩余字符
            if (time > 0) {
                while (tIndex < tChars.length && tChars[tIndex] == currChar) {
                    --time;
                    ++tIndex;
                }
                if (time > 0) {
                    return false;
                }
            }
            // typed 循环结束，检查 tIndex 是否还有剩余字符
            return tIndex == tChars.length;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.isLongPressedName("alex", "aaleex"));
        System.out.println(solution.isLongPressedName("saeed", "ssaaedd"));
    }
}
